import os
import PySpin
import sys

NUM_IMAGE = 10 #要抓取的图像数
def acquire_image(cam_list):
    print('*** 图像获取 ***')
    try:
        result = True

        #每个相机的预备动作，需要预设采集模式后，之后才能采集图像
        for i,cam in enumerate(cam_list):
            #设置采集模式为连续Continuous
            node_acquisition_mode = PySpin.CEnumerationPtr(cam.GetNodeMap().GetNode('AcquisitionMode'))
            if not PySpin.IsAvailable(node_acquisition_mode) or not PySpin.IsWritable(node_acquisition_mode):
                print('%d号相机无法设置连续模式\n' %i)
                return False

            node_acquisition_mode_continuous = node_acquisition_mode.GetEntryByName('Continuous')
            if not PySpin.IsAvailable(node_acquisition_mode_continuous) or not PySpin.IsReadable(node_acquisition_mode_continuous):
                print('%d号相机无法设置连续模式\n' %i)
                return False

            node_acquisition_mode.SetIntValue(node_acquisition_mode_continuous.GetValue())
            print('%d号相机采样模式已经设置为了连续' %i)
            cam.BeginAcquisition()

        #从每个相机中获取、保存、转化照片
        #为了让相机们同时工作，所以需要嵌套循环，不然会导致从一个相机取多张图像
        for n in range(NUM_IMAGE):
            for i, cam in enumerate(cam_list):
                try:
                    #检索设备串口名为文件名
                    node_device_serial_number = PySpin.CStringPtr(cam.GetTLDeviceNodeMap().GetNode('DeviceSerialNumber'))
                    if PySpin.IsAvailable(node_device_serial_number) and PySpin.IsReadable(node_device_serial_number):
                        device_serial_number = node_device_serial_number.GetValue()
                        print('%i号相机的串口数为%s'%(i, device_serial_number))

                    #获取接收的图片，并且确保图片的完整性
                    image_result = cam.GetNextImage(1000) #这是1000ms，代表1000ms没有接收图片便报错
                    print('what')
                    if image_result.IsIncomplete():
                        print('图片不完整，图片的状态为%d' %image_result.GetImageStatus())
                    else:
                        #打印照片信息
                        width = image_result.GetWidth()
                        height = image_result.GetHeight()
                        print('%d号相机获取第%d张图片，宽：%d, 高：%d' %(i, n, width, height))

                        #转化图片为mono8
                        image_converted = image_result.Convert(PySpin.PixelFormat_Mono8, PySpin.HQ_LINEAR)

                        #创建一个独一无二的文件名
                        if device_serial_number:
                            filename = 'AcquisitionMultipleCamera-%s-%d.jpg' %(device_serial_number, n)
                        else:
                            filename = 'AcquisitionMultipleCamera-%d-%d.jpg' %(i, n)

                        #保存图片
                        image_converted.Save(filename)
                        print('图片保存为%s' %filename)
                    #释放图片
                    image_result.Release()

                except PySpin.SpinnakerException as ex:
                    print('Error: %s' % ex)
                    result = False
         #结束每台相机的获取模式
        for cam in cam_list:
            cam.EndAcquisition()





    except PySpin.SpinnakerException as ex:
        print('Error: %s' % ex)
        result = False

    return result


def run_multiple_cameras(cam_list):
    try:
        result = True
        print('*** 设备信息 ***')
        for i, cam in enumerate(cam_list):
            #初始化相机
            cam.Init()

        #从所有相机中获取图片
        result &= acquire_image(cam_list)

        for i, cam in enumerate(cam_list):
            # 初始化相机
            cam.DeInit()

        del cam
    except PySpin.SpinnakerException as ex:
        print('Error: %s' % ex)
        result = False

    return result




def main():
    #查看当前文件夹是否有写入权限
    try:
        test_file = open('test.txt', 'w+')
    except IOError:
        print('当前文件夹不可写入')
        input('按enter退出')
        return False
    test_file.close()
    os.remove(test_file.name) #删除该文件
    result = True

    #检索系统对象
    system = PySpin.System.GetInstance()

    #从系统对象中检索相机列表
    cam_list = system.GetCameras()

    #从相机列表中查看有几台相机
    num_cameras = cam_list.GetSize()

    print('有%d台相机' %num_cameras)

    #如果没有相机，要清空相机列表，释放系统
    if num_cameras == 0:
        cam_list.Clear()
        system.ReleaseInstance()
        print('没有相机检测到呀！')
        input('按enter退出')
        return False

    print('运行所有相机')
    result = run_multiple_cameras(cam_list)

    #清空相机列表
    cam_list.Clear()

    #释放系统
    system.ReleaseInstance()
    input('按Enter退出')
    return result


if __name__ == '__main__':
    if main():
        sys.exit(0)
    else:
        sys.exit(1)
